package com.zhijiang.hospital.service.impl;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.zhijiang.hospital.entity.Questionnaire;
import com.zhijiang.hospital.mapper.QuestionnaireMapper;
import com.zhijiang.hospital.service.QuestionnairService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class QuestionnairServiceImpl implements QuestionnairService {

    @Autowired
    QuestionnaireMapper questionnaireMapper;

    @Override
    public void read(MultipartFile file) throws IOException {

        try {
            //获取文件的数据
            EasyExcel.read(file.getInputStream(), Questionnaire.class, new AnalysisEventListener<Questionnaire>() {

                /**
                 * 批处理阈值，作用：减轻数据库的压力
                 */
                private static final int BATCH_COUNT = 1;

                /**
                 * 存储员工对象
                 */
                List<Questionnaire> list = new ArrayList<Questionnaire>(BATCH_COUNT);

                //easyExcel每次从Excel中读取一行数据就会调用一次invoke方法
                @Override
                public void invoke(Questionnaire questionnaire, AnalysisContext analysisContext) {
                    questionnaire.setCode(IdWorker.getTimeId());
                    Questionnaire questionnaire1 = questionnaireMapper.selectOne(new LambdaQueryWrapper<Questionnaire>().
                            eq(Questionnaire::getStime, questionnaire.getStime()).eq(Questionnaire::getName, questionnaire.getName()));
                    if (Objects.isNull(questionnaire1)) {
                        questionnaireMapper.insert(questionnaire);
                    }


                    list.clear();

                }

                @Override
                public void doAfterAllAnalysed(AnalysisContext context) {

                }
                //easyExcel在将Excel表中数据读取完毕后，最终执行此方法
//                @Override
//                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//                    //最后,如果size<BATCH_COUNT就在这里进行数据的处理
//                    if (list.size() > 0) {
//                        questionnaireMapper.addBatch(list);
//                    }
//                }
                // 在此匿名内部类的方法里，throw new ExcelAnalysisStopException()就会终止easyExcel的运行。

                /**
                 *监听器实现这个方法就可以在读取数据的时候获取到异常信息
                 * @param exception
                 * @param context
                 * @throws Exception
                 */
                @Override
                public void onException(Exception exception, AnalysisContext context) {
                    // 此方法能接住，在此匿名内部类的方法里抛出的异常，并进行处理，然后继续invoke方法。
                    if (exception instanceof ExcelDataConvertException) {
                        ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                    }
                }
            }).sheet().headRowNumber(1).doRead();//sheet()参数指定，默认读取第一张工作表
        } catch (IOException e) {
            e.printStackTrace();
        }
        //将文件数据插入数据库
    }


}
